/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.jm.acionista.view;

import br.jm.acionista.entity.CepCidade;
import br.jm.acionista.entity.CepUf;
import br.jm.acionista.sistema.eao.CepUfEao;
import br.jm.acionista.sistema.eao.CidadeEao;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import org.primefaces.event.SelectEvent;
import org.primefaces.model.LazyDataModel;

/**
 *
 * @author joao
 */
public class CidadeBean implements Serializable {

    private static final long serialVersionUID = 1L;
    private CepCidade selectedCidade;
    private CepUf cepUf;
    private LazyDataModel<CepCidade> lazyModel;
    private CidadeEao cidadeEAO;
    private List<CepUf> cepUfList;
    private CepUfEao cepUfEAO;
    private Map<String, String> pesquisas = new HashMap<String, String>();
    private int nPageSize = 10;
    private boolean disable;

    public CidadeBean() {
        cidadeEAO = CidadeEao.getInstance();
        cepUfEAO = CepUfEao.getInstance();
        cepUf = new CepUf();
        selectedCidade = new CepCidade();
        selectedCidade.setCodUf(cepUf);

        disable = true;

        this.lazyModel = new LazyDataModel<CepCidade>() {

            /**
             * Dummy implementation of loading a certain segment of data. In a
             * real application, this method should load data from a datasource
             */
            public List<CepCidade> load(int first, int pageSize, String sortField, boolean sortOrder, Map<String, String> filters) {

                List<CepCidade> lazyCepCidades = new ArrayList<CepCidade>();

                try {
                    lazyCepCidades = cidadeEAO.getNative("CepCidade", first, pageSize, sortField, sortOrder, filters, null);
                    this.setPageSize(pageSize);
                } catch (Exception ex) {
                    Logger.getLogger(CidadeBean.class.getName()).log(Level.SEVERE, null, ex);
                }

                return lazyCepCidades;
            }
        };

        /**
         * In a real application, this number should be resolved by a projection
         * query
         */
        this.lazyModel.setPageSize(nPageSize);
        this.lazyModel.setRowCount(cidadeEAO.getCount("CepCidade"));
    }

    public void inserir(ActionEvent actionEvent) {
        FacesMessage msg = null;

        try {
            selectedCidade.setCodCidade(null);
            cidadeEAO.create(selectedCidade);

            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Cidade Inserida com Sucesso",
                    selectedCidade.getDscCidade());

        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro ao Inserir: " + selectedCidade.getDscCidade(),
                    e.getMessage());
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void alterar(ActionEvent actionEvent) {
        FacesMessage msg = null;

        try {
            cidadeEAO.edit(selectedCidade);
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Cidade Alterada com Sucesso",
                    selectedCidade.getDscCidade());
        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro ao Alterar: " + selectedCidade.getDscCidade(),
                    e.getMessage());
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void excluir(ActionEvent actionEvent) {
        FacesMessage msg = null;

        try {
            cidadeEAO.destroy(selectedCidade);

            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Cidade Excluida com Sucesso",
                    selectedCidade.getDscCidade());
        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro ao Excluir: " + selectedCidade.getDscCidade(),
                    e.getMessage());
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public List<String> complete(String query) {
        pesquisas.clear();
        pesquisas.put("codUf", query);
        List<String> results = new ArrayList<String>();

        cepUfList = new ArrayList<CepUf>();
        try {
            cepUfList = cepUfEAO.getNative("CepUf", 0, 10, "dscEstado", true, pesquisas, null);

            for (int i = 0; i < cepUfList.size(); i++) {
                results.add(cepUfList.get(i).getCodUf());
            }
        } catch (Exception ex) {
            Logger.getLogger(CidadeBean.class.getName()).log(Level.SEVERE, null, ex);
        }

        return results;
    }

    public LazyDataModel<CepCidade> getLazyModel() {
        return lazyModel;
    }

    public void setLazyModel(LazyDataModel<CepCidade> lazyModel) {
        this.lazyModel = lazyModel;
    }

    public CepCidade getSelectedCidade() {
        if (selectedCidade == null) {
            cepUf = new CepUf();
            selectedCidade = new CepCidade();
            selectedCidade.setCodUf(cepUf);
        }
        return selectedCidade;
    }

    public void setSelectedCidade(CepCidade selectedCidade) {
        this.selectedCidade = selectedCidade;
    }

    public boolean isDisable() {
        return disable;
    }

    public void setDisable(boolean disable) {
        this.disable = disable;
    }

    public void onRowSelectCidade(SelectEvent event) {
        this.disable = true;
    }

    public CepCidade novo() {
        this.disable = false;
        this.cepUf = new CepUf();
        this.selectedCidade = new CepCidade();
        this.selectedCidade.setCodUf(cepUf);

        return this.selectedCidade;
    }

    public void handleSelect(SelectEvent event) {
        CepUf cepUfTemp = (CepUf) event.getObject();

        this.selectedCidade.setCodUf(cepUfTemp);
    }
}
